home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / IEditor / objects.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-17  |  11.2 KB  |  420 lines

  1. /// Include
  2. #include <stdarg.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #define INTUI_V36_NAMES_ONLY
  8.  
  9. #include <exec/nodes.h>                 // exec
  10. #include <exec/lists.h>
  11. #include <exec/memory.h>
  12. #include <exec/ports.h>
  13. #include <exec/libraries.h>
  14. #include <dos/dos.h>                    // dos
  15. #include <clib/exec_protos.h>           // protos
  16. #include <clib/intuition_protos.h>
  17. #include <clib/gadtools_protos.h>
  18. #include <pragmas/exec_pragmas.h>       // pragmas
  19. #include <pragmas/intuition_pragmas.h>
  20. #include <pragmas/gadtools_pragmas.h>
  21.  
  22. #include "DEV_IE:defs.h"
  23. #include "DEV_IE:GUI.h"
  24. #include "DEV_IE:Include/expanders-protos.h"
  25. #include "DEV_IE:Include/expanders.h"
  26. #include "DEV_IE:Include/expander_pragmas.h"
  27. ///
  28. /// Prototypes
  29. static void     InitWindowInfo( APTR );
  30. static void     InitGadgetInfo( APTR );
  31. static void     InitBooleanInfo( APTR );
  32. static void     InitGadgetScelta( APTR );
  33. static void     InitBevelBox( APTR );
  34. static void     InitIText( APTR );
  35. static void     InitMenuSub( APTR );
  36. static void     InitMenuItem( APTR );
  37. static void     InitMenuTitle( APTR );
  38. static void     InitRexxNode( APTR );
  39. static void     InitWndToOpen( APTR );
  40. static void     InitLibNode( APTR );
  41. static void     InitGadgetBank( APTR );
  42. static void     InitBOOPSIInfo( APTR );
  43. static void     InitBTag( APTR );
  44. static void     InitLocaleString( APTR );
  45. static void     InitLocaleLanguage( APTR obj );
  46. static void     InitLocaleTranslation( APTR obj );
  47. static void     FreeWindowInfo( APTR );
  48. static void     FreeGadgetInfo( APTR );
  49. static void     FreeBooleanInfo( APTR );
  50. static void     FreeIText( APTR );
  51. static void     FreeMenuItem( APTR );
  52. static void     FreeMenuTitle( APTR );
  53. static void     FreeBOOPSIInfo( APTR );
  54. static void     FreeLocaleString( APTR );
  55. static void     FreeLocaleTranslation( APTR );
  56. static void     FreeArrayNode( APTR );
  57. static void     FreeTranslations( struct MinList * );
  58. ///
  59. /// Data
  60. static const struct ObjData {
  61.                 ULONG   Size;
  62.                 APTR    Init;
  63.                 APTR    Free;
  64.             } Objects[] = {
  65.     sizeof( struct WindowInfo ),        InitWindowInfo,         FreeWindowInfo,
  66.     sizeof( struct GadgetInfo ),        InitGadgetInfo,         FreeGadgetInfo,
  67.     sizeof( struct BooleanInfo ),       InitBooleanInfo,        FreeBooleanInfo,
  68.     sizeof( struct GadgetScelta ),      InitGadgetScelta,       NULL,
  69.     sizeof( struct BevelBoxNode ),      InitBevelBox,           NULL,
  70.     sizeof( struct WndImages ),         NULL,                   NULL,
  71.     sizeof( struct ITextNode ),         InitIText,              FreeIText,
  72.     sizeof( struct ImageNode ),         NULL,                   NULL,
  73.     sizeof( struct MenuSub ),           InitMenuSub,            NULL,
  74.     sizeof( struct _MenuItem ),         InitMenuItem,           FreeMenuItem,
  75.     sizeof( struct MenuTitle ),         InitMenuTitle,          FreeMenuTitle,
  76.     sizeof( struct RexxNode ),          InitRexxNode,           NULL,
  77.     sizeof( struct WndToOpen ),         InitWndToOpen,          NULL,
  78.     sizeof( struct LibNode ),           InitLibNode,            NULL,
  79.     sizeof( struct GadgetBank ),        InitGadgetBank,         NULL,
  80.     sizeof( struct BGadget ),           NULL,                   NULL,
  81.     sizeof( struct BOOPSIInfo ),        InitBOOPSIInfo,         FreeBOOPSIInfo,
  82.     sizeof( struct BTag ),              InitBTag,               NULL,
  83.     sizeof( struct LocaleStr ),         InitLocaleString,       FreeLocaleString,
  84.     sizeof( struct LocaleLanguage ),    InitLocaleLanguage,     NULL,
  85.     sizeof( struct LocaleTranslation ), NULL,                   FreeLocaleTranslation,
  86.     sizeof( struct ArrayNode ),         NULL,                   FreeArrayNode,
  87. };
  88. ///
  89.  
  90.  
  91.  
  92. /// AllocObject
  93. APTR AllocObject( __D0 UWORD Type )
  94. {
  95.     APTR    Ptr = NULL;
  96.  
  97.     if( Type <= IE_LASTOBJ ) {
  98.     struct ObjData *Data;
  99.  
  100.     Data = &Objects[ Type ];
  101.  
  102.     if( Ptr = AllocMem( Data->Size, MEMF_CLEAR )) {
  103.         void    ( *InitFunc )( APTR );
  104.  
  105.         if( InitFunc = Data->Init )
  106.         InitFunc( Ptr );
  107.     }
  108.     }
  109.  
  110.     return( Ptr );
  111. }
  112. ///
  113. /// FreeObject
  114. void FreeObject( __A0 APTR Object, __D0 UWORD Type )
  115. {
  116.     void    ( *FreeFunc )( APTR );
  117.  
  118.     if(( Object ) && ( Type <= IE_LASTOBJ )) {
  119.     struct ObjData *Data;
  120.  
  121.     Data = &Objects[ Type ];
  122.  
  123.     if( FreeFunc = Data->Free )
  124.         FreeFunc( Object );
  125.  
  126.     FreeMem( Object, Data->Size );
  127.     }
  128. }
  129. ///
  130.  
  131. /// InitWindowInfo
  132. void InitWindowInfo( APTR wnd )
  133. {
  134.     NewList( &((struct WindowInfo *)wnd )->wi_Gadgets   );
  135.     NewList( &((struct WindowInfo *)wnd )->wi_Menus     );
  136.     NewList( &((struct WindowInfo *)wnd )->wi_Boxes     );
  137.     NewList( &((struct WindowInfo *)wnd )->wi_Images    );
  138.     NewList( &((struct WindowInfo *)wnd )->wi_ITexts    );
  139.     NewList( &((struct WindowInfo *)wnd )->wi_GBanks    );
  140. }
  141. ///
  142. /// InitGadgetInfo
  143. void InitGadgetInfo( APTR gad )
  144. {
  145.     NewList( &((struct GadgetInfo *)gad )->g_Scelte );
  146.  
  147.     ((struct GadgetInfo *)gad )->g_UserData   = gad;
  148.     ((struct GadgetInfo *)gad )->g_GadgetText = ((struct GadgetInfo *)gad )->g_Titolo;
  149.     ((struct GadgetInfo *)gad )->g_VisualInfo = VisualInfo;
  150. }
  151. ///
  152. /// InitBooleanInfo
  153. void InitBooleanInfo( APTR gad )
  154. {
  155.     ((struct BooleanInfo *)gad )->b_GadgetType = GTYP_BOOLGADGET;
  156.     ((struct BooleanInfo *)gad )->b_GadgetText = &((struct BooleanInfo *)gad )->b_FrontPen;
  157. }
  158. ///
  159. /// InitGadgetScelta
  160. void InitGadgetScelta( APTR gs )
  161. {
  162.     ((struct GadgetScelta *)gs )->gs_Node.ln_Name = ((struct GadgetScelta *)gs )->gs_Testo;
  163. }
  164. ///
  165. /// InitBevelBox
  166. void InitBevelBox( APTR box )
  167. {
  168.     (( struct BevelBoxNode *)box )->bb_VITag      = GT_VisualInfo;
  169.     (( struct BevelBoxNode *)box )->bb_VisualInfo = VisualInfo;
  170.     (( struct BevelBoxNode *)box )->bb_RTag       = TAG_IGNORE;
  171.     (( struct BevelBoxNode *)box )->bb_TTag       = GTBB_FrameType;
  172. }
  173. ///
  174. /// InitIText
  175. void InitIText( APTR itn )
  176. {
  177.     ((struct ITextNode *)itn )->itn_Node.ln_Name = ((struct ITextNode *)itn )->itn_IText = ((struct ITextNode *)itn )->itn_Text;
  178. }
  179. ///
  180. /// InitMenuSub
  181. void InitMenuSub( APTR sub )
  182. {
  183.     ((struct MenuSub *)sub )->msn_Node.ln_Name = ((struct MenuSub *)sub )->msn_Text;
  184. }
  185. ///
  186. /// InitMenuItem
  187. void InitMenuItem( APTR item )
  188. {
  189.     NewList( &(( struct _MenuItem *)item )->min_Subs          );
  190.  
  191.     (( struct _MenuItem *)item )->min_Node.ln_Name = (( struct _MenuItem *)item )->min_Text;
  192. }
  193. ///
  194. /// InitMenuTitle
  195. void InitMenuTitle( APTR menu )
  196. {
  197.     NewList( &(( struct MenuTitle *)menu )->mt_Items  );
  198.  
  199.     (( struct MenuTitle *)menu )->mt_Node.ln_Name = (( struct MenuTitle *)menu )->mt_Text;
  200. }
  201. ///
  202. /// InitRexxNode
  203. void InitRexxNode( APTR rexx )
  204. {
  205.     ((struct RexxNode *)rexx )->rxn_Node.ln_Name = ((struct RexxNode *)rexx )->rxn_Name;
  206. }
  207. ///
  208. /// InitWndToOpen
  209. void InitWndToOpen( APTR wto )
  210. {
  211.     ((struct WndToOpen *)wto )->wto_Node.ln_Name = ((struct WndToOpen *)wto )->wto_Label;
  212. }
  213. ///
  214. /// InitLibNode
  215. void InitLibNode( APTR lib )
  216. {
  217.     ((struct LibNode *)lib )->lbn_Node.ln_Name = ((struct LibNode *)lib )->lbn_Name;
  218. }
  219. ///
  220. /// InitGadgetBank
  221. void InitGadgetBank( APTR bank )
  222. {
  223.     ((struct GadgetBank *)bank )->Node.ln_Name = ((struct GadgetBank *)bank )->Label;
  224.  
  225.     NewList(( struct List * )&((struct GadgetBank *)bank )->Gadgets );
  226.     NewList(( struct List * )&((struct GadgetBank *)bank )->Storage );
  227. }
  228. ///
  229. /// InitBOOPSIInfo
  230. void InitBOOPSIInfo( APTR obj )
  231. {
  232.     NewList(( struct List * )&(( struct BOOPSIInfo * )obj )->Tags   );
  233. }
  234. ///
  235. /// InitBTag
  236. void InitBTag( APTR obj )
  237. {
  238.     NewList(( struct List * )&(( struct BTag * )obj )->Items );
  239. }
  240. ///
  241. /// InitLocaleString
  242. void InitLocaleString( APTR obj )
  243. {
  244.     NewList(( struct List * )&(( struct LocaleStr * )obj )->Translations );
  245.  
  246.     (( struct LocaleStr * )obj )->Node.ln_Name = (( struct LocaleStr * )obj )->String;
  247. }
  248. ///
  249. /// InitLocaleLanguage
  250. void InitLocaleLanguage( APTR obj )
  251. {
  252.     (( struct LocaleLanguage * )obj )->Node.ln_Name = (( struct LocaleLanguage * )obj )->Language;
  253. }
  254. ///
  255.  
  256.  
  257. /// FreeWindowInfo
  258. #define wnd (( struct WindowInfo * )obj )
  259.  
  260. void FreeWindowInfo( APTR obj )
  261. {
  262.     struct GadgetInfo  *gad;
  263.     struct WindowInfo  *wnd2;
  264.     struct IEXNode     *ex;
  265.  
  266.     /*  GList               */
  267.  
  268.     if( wnd->wi_GList )
  269.     FreeGadgets( wnd->wi_GList );
  270.  
  271.     /*  Gadget Banks        */
  272.     EliminaGBanks( wnd );
  273.  
  274.     /*  Gadgets             */
  275.  
  276.     for( gad = wnd->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  277.     if( gad->g_Kind < MIN_IEX_ID ) {
  278.         struct GadgetInfo  *next;
  279.  
  280.         next = gad->g_Node.ln_Pred;
  281.  
  282.         Remove(( struct Node * )gad );
  283.  
  284.         if( gad->g_Kind < BOOLEAN )
  285.         FreeObject( gad, IE_GADGET );
  286.         else
  287.         FreeObject( gad, IE_BOOLEAN );
  288.  
  289.         gad = next;
  290.  
  291.     } else
  292.         gad->g_flags2 |= G_ATTIVO;
  293.     }
  294.  
  295.     /*  Objects             */
  296.  
  297.     wnd2 = IE.win_info;
  298.     IE.win_info = wnd;
  299.  
  300.     for( ex = IE.Expanders.mlh_Head; ex->Node.ln_Succ; ex = ex->Node.ln_Succ ) {
  301.     struct Expander *IEXBase;
  302.     IEXBase = ex->Base;
  303.     IEX_Remove( ex->ID, &IE );
  304.     }
  305.  
  306.     IE.win_info = wnd2;
  307.  
  308.  
  309.     /*  Bevel Boxes         */
  310.     {
  311.     struct BevelBoxNode *bb;
  312.  
  313.     while( bb = RemTail(( struct List * )&wnd->wi_Boxes ))
  314.         FreeObject( bb, IE_BEVELBOX );
  315.     }
  316.  
  317.  
  318.     /*  IntuiTexts          */
  319.     {
  320.     struct ITextNode    *itn;
  321.  
  322.     while( itn = RemTail(( struct List * )&wnd->wi_ITexts ))
  323.         FreeObject( itn, IE_INTUITEXT );
  324.     }
  325.  
  326.     /*  Images              */
  327.     {
  328.     struct WndImages    *im;
  329.  
  330.     while( im = RemTail(( struct List * )&wnd->wi_Images ))
  331.         FreeObject( im, IE_WNDIMAGE );
  332.     }
  333.  
  334.     /*  Menus               */
  335.     {
  336.     struct MenuTitle    *menu;
  337.  
  338.     while( menu = (struct MenuTitle *) RemTail(( struct List * )&wnd->wi_Menus ))
  339.        FreeObject( menu, IE_MENUTITLE );
  340.     }
  341. }
  342. #undef wnd
  343. ///
  344. /// FreeGadgetInfo
  345. void FreeGadgetInfo( APTR obj )
  346. {
  347.     struct GadgetScelta    *gs;
  348.  
  349.     EliminaFont((( struct GadgetInfo * )obj )->g_Font );
  350.  
  351.     if((( struct GadgetInfo * )obj )->g_ExtraMem )
  352.     FreeVec((( struct GadgetInfo * )obj )->g_ExtraMem );
  353.  
  354.     while( gs = (struct GadgetScelta *)RemTail(( struct List * )&(( struct GadgetInfo * )obj )->g_Scelte ))
  355.     FreeObject( gs, IE_ITEM );
  356. }
  357. ///
  358. /// FreeBooleanInfo
  359. void FreeBooleanInfo( APTR obj )
  360. {
  361.     EliminaFont((( struct BooleanInfo * )obj )->b_Font );
  362. }
  363. ///
  364. /// FreeIText
  365. void FreeIText( APTR obj )
  366. {
  367.     if((( struct ITextNode * )obj )->itn_FontCopy )
  368.     EliminaFont(( struct TxtAttrNode *)((ULONG)(( struct ITextNode * )obj )->itn_FontCopy - 14 ));
  369. }
  370. ///
  371. /// FreeMenuTitle
  372. void FreeMenuTitle( APTR obj )
  373. {
  374.     struct _MenuItem    *item;
  375.  
  376.     while( item = (struct _MenuItem *)RemTail((struct List *)&(( struct MenuTitle * )obj )->mt_Items ))
  377.     FreeObject( item, IE_MENUITEM );
  378. }
  379. ///
  380. /// FreeMenuItem
  381. void FreeMenuItem( APTR obj )
  382. {
  383.     struct MenuSub  *sub;
  384.  
  385.     while( sub = ( struct MenuSub * )RemTail((struct List *)&(( struct _MenuItem * )obj )->min_Subs ))
  386.     FreeObject( sub, IE_MENUSUB );
  387. }
  388. ///
  389. /// FreeBOOPSIInfo
  390. void FreeBOOPSIInfo( APTR obj )
  391. {
  392.     struct BTag    *tag;
  393.  
  394.     while( tag = ( struct BTag * )RemTail(( struct List * )&(( struct BOOPSIInfo * )obj )->Tags ))
  395.     FreeObject( tag, IE_BTAG );
  396. }
  397. ///
  398. /// FreeLocaleString
  399. void FreeLocaleString( APTR obj )
  400. {
  401.     struct LocaleTranslation   *tran;
  402.  
  403.     while( tran = ( struct LocaleTranslation * )RemTail(( struct List * )&(( struct LocaleStr * )obj )->Translations ))
  404.     FreeObject( tran, IE_LOCALE_TRANSLATION );
  405. }
  406. ///
  407. /// FreeLocaleTranslation
  408. void FreeLocaleTranslation( APTR obj )
  409. {
  410.     FreeVec((( struct LocaleTranslation * )obj )->String );
  411. }
  412. ///
  413. /// FreeArrayNode
  414. void FreeArrayNode( APTR obj )
  415. {
  416.     if((( struct ArrayNode * )obj )->Array )
  417.     FreeVec((( struct ArrayNode * )obj )->Array );
  418. }
  419. ///
  420.